package com.cari.oa.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.springframework.stereotype.Repository;

import com.cari.oa.domain.SysRoleEntity;
import com.cari.oa.domain.SysUserRoleRelEntity;
import com.cari.oa.util.StrUtils;

/**
 * 系统角色DAO
 * User: yexuhui
 * Date: 12-12-13
 * Time: 下午3:07
 */
@SuppressWarnings("unchecked")
@Repository
public class SysRoleDao extends BaseDao<SysRoleEntity> {

    /**
     * 根据英文名获取系统角色实体
     * @param enname 系统角色英文名
     * @return 系统角色实体对象
     */
    public SysRoleEntity getByEnname(String enname) {
        Query query = getSession().createQuery("from SysRoleEntity where enname = :enname");
        query.setString("enname", enname);
        Object obj = query.uniqueResult();
        if(obj == null) return null;
        return (SysRoleEntity)obj;
    }
    
    /**
     * 判断该角色是否被用户使用
     * @param enname 角色英文名
     * @return 是否被使用
     */
    public boolean isRoleUsedByUser(String enname) {
    	Query query = getSession().createQuery("select count(*) from SysUserRoleRelEntity where roleName = :enname");
        query.setParameter("enname", enname);
        Long count = (Long)query.uniqueResult();
        return count > 0;    	
    }
    
    /**
     * 判断该英文名实体是否存在
     * @param enname 系统角色英文名
     * @return 是否存在
     */
    public boolean existByEnname(String enname) {
        Query query = getSession().createQuery("select count(*) from SysRoleEntity where enname = :enname");
        query.setParameter("enname", enname);
        Long count = (Long)query.uniqueResult();
        return count > 0;
    }    

    /**
     * 根据系统用户英文名获取系统角色实体列表
     * @param userEnname 系统用户英文名
     * @return 系统角色实体列表
     */
    public List<SysRoleEntity> getRolesByUserName(String userEnname) {
        String hql = "select r from SysRoleEntity r, SysUserRoleRelEntity rel where rel.userName = :username and rel.roleName = r.enname";
        Query query = getSession().createQuery(hql);
        query.setString("username", userEnname);
        return query.list();
    }

    /**
     * 根据系统用户英文名删除关联的所有系统角色
     * @param userEnname 系统用户英文名
     * @return 删除的条数
     */
    public int deleteRolesByUserName(String userEnname) {
        String hql = "delete SysUserRoleRelEntity rel where rel.userName = :username";
        Query query = getSession().createQuery(hql);
        query.setString("username", userEnname);
        return query.executeUpdate();
    }

    /**
     * 重置系统用户关联的角色
     * @param userEnname 系统用户英文名
     * @param roleNames 系统角色英文名列表
     */
    public void resetRoles(String userEnname, List<String> roleNames) {
        deleteRolesByUserName(userEnname);
        for (String roleName : roleNames) {
        	if(StrUtils.isEmpty(roleName)) continue;
        	
            SysUserRoleRelEntity relEntity = new SysUserRoleRelEntity();
            relEntity.setUserName(userEnname);
            relEntity.setRoleName(roleName);
            getSession().save(relEntity);
        }
    }
    
    /**
     * 分页查询系统角色列表
     * @param enname 系统角色英文名
     * @param alias 系统角色中文名
     * @param page 当前页
     * @param size 每页条数
     * @return 分页列表
     */
    public List<SysRoleEntity> getPage(String enname, String alias, int page, int size) {
    	List<Object> params = new ArrayList<Object>();

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("from SysRoleEntity r where 1=1 ");

        if(StrUtils.isNotEmpty(enname)) {
            stringBuilder.append("and r.enname like ? ");
            params.add("%" + enname + "%");
        }

        if(StrUtils.isNotEmpty(alias)) {
            stringBuilder.append("and r.alias like ? ");
            params.add("%" + alias + "%");
        }

        return getPage(stringBuilder.toString(), page, size, params.toArray());
    }
    
    /**
     * 系统角色查询记录条数
     * @param enname 系统角色英文名
     * @param alias 系统角色中文名
     * @return 查询记录条数
     */
    public long getCount(String enname, String alias) {
    	List<Object> params = new ArrayList<Object>();

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("select count(*) from SysRoleEntity r where 1=1 ");
        
        if(StrUtils.isNotEmpty(enname)) {
            stringBuilder.append("and r.enname like ? ");
            params.add("%" + enname + "%");
        }

        if(StrUtils.isNotEmpty(alias)) {
            stringBuilder.append("and r.alias like ? ");
            params.add("%" + alias + "%");
        }
        
        Query query = getSession().createQuery(stringBuilder.toString());
        for (int i = 0; i < params.size(); i++) {
            query.setParameter(i, params.get(i));
        }
        return (Long)query.uniqueResult();
    }    
}
